package com.wn.sk.common.jwt;

import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yellow Docter
 * @date 2022 -09-06
 * @desc  封装 jwt的创建
 */
public class JwtTemplate {

    /**
     * 证书文件
     */
    private String path = "jwt.jks";

    /**
     * 密码库的密码
     */
    private String keyStorePassword = "123456";

    /**
     * 密码框别名
     */
    private String alias = "jwt";

    /**
     * 创建一个token的操作
     * @param payload    载荷
     * @return       返回一个token
     */
    public String createToken(Map<String,Object> payload){
        String token = JWTUtil.createToken(payload, createJwtSigner());
        return token;

    }

    /**
     * 解析 token
     * @param token             传入的token
     * @param payLoadKey        载荷的key
     * @return
     */
    public Object parseToken(String token,String payLoadKey){
        JWT jwt = JWTUtil.parseToken(token);
        return jwt.getPayload(payLoadKey);
    }

    /**
     *  验证   token
     *  通过  签名器 进行验证
     * @param token
     * @return
     */
    public boolean verifyToken(String token){
        boolean verify = JWTUtil.verify(token, createJwtSigner());
        return verify;
    }

    /**
     * 创建一个签名器
     * @return
     */
    private JWTSigner createJwtSigner() {
        JWTSigner jwtSigner = JWTSignerUtil.createSigner("RSA", getKeyPair());
        return jwtSigner;
    }

    /**
     * 获取私密对
     * @return
     */
    private KeyPair getKeyPair() {

        KeyStoreKeyFactory keyFactory = new KeyStoreKeyFactory(
                new ClassPathResource(path), //加载文件 ()
                keyStorePassword.toCharArray()
        );
        KeyPair keyPair = keyFactory.getKeyPair(alias);
        return keyPair;
    }

    public static void main(String[] args) {
//        new JwtTemplate()
    }

}
